# coding: utf-8
import datetime
import os
import json
from django.conf import settings


def is_can_do(do_key, begin_time="00:01", end_time="23:59", count=1, interval_minute=0, cur_dt='now'):
    """
    指定时间范围是否可做某操作。时间为24小时制。
    :param do_key:  操作的键
    :param begin_time: 开始时间（24小时制，如：00:01）
    :param end_time: 结束时间（24小时制，如：23:59）
    :param count: 可执行次数
    :param interval_minute: 执行次数每次间隔分钟
    :param cur_dt: 当前日期时间("2020-08-24 14:22:35")
    :return: [True|False]
    """
    if cur_dt == 'now':
        cur_dt = datetime.datetime.now()
    else:
        cur_dt = datetime.datetime.strptime(cur_dt, "%Y-%m-%d %H:%M:%S")
    begin_dt = cur_dt.strftime("%Y-%m-%d ") + begin_time.strip()
    end_dt = cur_dt.strftime("%Y-%m-%d ") + end_time.strip()
    begin_dt = datetime.datetime.strptime(begin_dt, "%Y-%m-%d %H:%M")
    end_dt = datetime.datetime.strptime(end_dt, "%Y-%m-%d %H:%M")

    if not (begin_dt < cur_dt < end_dt):
        return False
    else:

        filepath = os.path.join(settings.TEMP_DIR, do_key + '.status.json')
        # filepath = os.path.join('../temp_data', 'status.json')
        if not os.path.exists(filepath):
            with open(filepath, 'w', encoding='utf-8') as f:
                f.write(json.dumps([cur_dt.strftime("%Y-%m-%d %H:%M")], indent=2, ensure_ascii=False))
            return True

        with open(filepath, 'r+', encoding='utf-8') as f:
            dt_list = json.loads(f.read())
            f.seek(0)
            f.truncate()    # 单独 f.truncate(0) 清空后文件指针还是指向当前位置，指针前用\0字符替换，因此先f.seek(0)后再f.truncate()

            dt_item = datetime.datetime.strptime(dt_list[0], "%Y-%m-%d %H:%M").date()
            if dt_item < cur_dt.date():
                # 当天之前的直接更新为当天时间，并返回True
                dt_list = [cur_dt.strftime("%Y-%m-%d %H:%M")]
                f.write(json.dumps(dt_list, indent=2, ensure_ascii=False))
                return True

            if len(dt_list) == count:
                # 当天记录达到了指定的次数，不可再进行操作
                f.write(json.dumps(dt_list, indent=2, ensure_ascii=False))
                return False

            if len(dt_list) < count:
                # 执行多次时，通过最后一条记录来判断当前时间是否超过上次记录时间，超过就增加一条记录，并返回True
                dt_item = datetime.datetime.strptime(dt_list[-1], "%Y-%m-%d %H:%M")
                if dt_item + datetime.timedelta(minutes=interval_minute) < cur_dt:
                    dt_list.append(cur_dt.strftime("%Y-%m-%d %H:%M"))
                    f.write(json.dumps(dt_list, indent=2, ensure_ascii=False))
                    return True
                else:
                    f.write(json.dumps(dt_list, indent=2, ensure_ascii=False))
                    return False


def main():
    print("get_pbc_data:", is_can_do('am_get_pbc_data', begin_time="09:20", end_time="23:59"))
    print("am_get_1.000001_data:", is_can_do('am_get_1.000001_data', begin_time="09:25", end_time="15:00", count=4, interval_minute=1))
    print("pm_get_1.000001_data:", is_can_do('pm_get_1.000001_data', begin_time="15:00", count=4, interval_minute=1))


if __name__ == '__main__':
    main()
